home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programmer's Power Pack / Delphi Volume 1.iso / e_to_l / fbuilder / delphi / demos / eis1.pas < prev    next >
Pascal/Delphi Source File  |  1996-09-15  |  6KB  |  232 lines

  1. { FormulaBuilder                }
  2. { YGB Software, Inc.            }
  3. { Copyright 1995 Clayton Collie }
  4. { All rights reserved           }
  5.  
  6. { EIS Demo. Demonstrates the inefficiency }
  7. { of using the usual methods of variable  }
  8. { handling in cases where variable data   }
  9. { is voluminous and changes frequently    }
  10.  
  11. unit Eis1;
  12. interface
  13. uses
  14.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  15.   StdCtrls, Forms, DBCtrls, DB, DBGrids,SSheet,FBCOMP,FBDBCOMP, Grids,
  16.   DBTables, ExtCtrls, Buttons;
  17.  
  18. type
  19.   TForm2 = class(TForm)
  20.     DBGrid1: TDBGrid;
  21.     DBNavigator: TDBNavigator;
  22.     Panel1: TPanel;
  23.     DataSource1: TDataSource;
  24.     Panel2: TPanel;
  25.     Table1: TTable;
  26.     Panel3: TPanel;
  27.     SSheetGrid: TStringGrid;
  28.     GroupBox1: TGroupBox;
  29.     ResultPanel: TPanel;
  30.     FormulaEdit: TEdit;
  31.     BitBtn1: TBitBtn;
  32.     SpeedButton1: TSpeedButton;
  33.     Expression: TExpression;
  34.     procedure FormCreate(Sender: TObject);
  35.     procedure SSheetGridGetEditText(Sender: TObject; ACol, ARow: Longint;
  36.       var Value: OpenString);
  37.     procedure SSheetGridSetEditText(Sender: TObject; ACol, ARow: Longint;
  38.       const Value: String);
  39.     procedure FormDestroy(Sender: TObject);
  40.     procedure SpeedButton1Click(Sender: TObject);
  41.     procedure DataSource1DataChange(Sender: TObject; Field: TField);
  42.   private
  43.     { private declarations }
  44.     Sheet : TSpreadSheet;
  45.     ExprInitialized : boolean;
  46.   public
  47.     { public declarations }
  48.     Expression : TExpression;
  49.     Procedure AddVariables;
  50.     Procedure UpdateVariables( updateSheetvars : boolean );
  51.   end;
  52.  
  53. var
  54.   Form2: TForm2;
  55.  
  56. implementation
  57. uses fbcalc;
  58. {$R *.DFM}
  59. {
  60. The syntax for "spreadsheet" cell access in RnCn where n is an integer,
  61. for example :
  62.  
  63.        "R1C1 * R2C2 - R5C2"
  64. }
  65.  
  66.  
  67. procedure TForm2.FormCreate(Sender: TObject);
  68. var r, c   : integer;
  69.     tmpstr : String[15];
  70. begin
  71.   Sheet := TSpreadSheet.Create(NIL);
  72.   ExprInitialized := Expression.Status = EXPR_SUCCESS;
  73.   AddVariables;
  74.   Table1.Open;
  75.   for r := 0 to MAXROWS do
  76.   for c := 0 to MAXCOLS do
  77.   begin
  78.     if (r + c = 0) then continue;
  79.     if (r = 0) then
  80.     begin
  81.       tmpStr := 'C'+IntToStr(c);
  82.       SSheetGrid.Cells[c,r] := tmpstr;
  83.     end
  84.    else
  85.     if (c = 0) then
  86.     begin
  87.       tmpStr := 'R'+IntToStr(r);
  88.       SSheetGrid.Cells[c,r] := tmpstr;
  89.     end
  90.    else
  91.     begin
  92.        tmpstr := FloatToStrF(Sheet.SheetData[r,c],ffCurrency,10,2);
  93.        SSheetGrid.Cells[c,r] := tmpstr;
  94.     end;
  95.   end;
  96. end;
  97.  
  98.  
  99.  
  100. Procedure TForm2.AddVariables;
  101. var r , c : integer;
  102.     tmp : string[10];
  103. begin
  104.   { Add variables to the engine. Note that since our spreadheet }
  105.   { is 10 x 10, we end up adding a total of 117 variables to ONE }
  106.   { INSTANCE. Even so, there is no guarantee that any one of these }
  107.   { variables will be used. }
  108.   { Imagine,  also if we needed to link to another table with a different
  109.     structure }
  110.  
  111.   if ExprInitialized then
  112.   With Expression do begin
  113.        AddVariable('SYMBOL',vtSTRING);
  114.        AddVariable('CO_NAME',vtSTRING);
  115.        AddVariable('CO_NAME',vtSTRING);
  116.        AddVariable('CUR_PRICE',vtFLOAT);
  117.        AddVariable('YRL_HIGH',vtFLOAT);
  118.        AddVariable('YRL_LOW',vtFLOAT);
  119.        AddVariable('P_E_RATIO',vtFLOAT);
  120.        AddVariable('BETA',vtFLOAT);
  121.        AddVariable('PROJ_GRTH',vtFLOAT);
  122.        AddVariable('INDUSTRY',vtINTEGER);
  123.        AddVariable('PRICE_CHG',vtINTEGER);
  124.        AddVariable('SAFETY',vtINTEGER);
  125.        AddVariable('RATING',vtSTRING);
  126.        AddVariable('RANK',vtINTEGER);
  127.        AddVariable('OUTLOOK',vtINTEGER);
  128.        AddVariable('RCMNDATION',vtSTRING);
  129.        AddVariable('RISK',vtSTRING);
  130.   end;
  131.   for r := 1 to MAXROWS do
  132.   for c := 1 to MAXCOLS do
  133.   begin
  134.     tmp := 'R'+IntToStr(R)+'C'+IntToStr(c);
  135.     Expression.AddVariable( tmp, vtFLOAT );
  136.   end;
  137. end;
  138.  
  139.  
  140. Procedure TForm2.UpdateVariables( updateSheetVars : Boolean );
  141. var r,c : word;
  142.     tmp : string[10];
  143.  
  144.    Procedure UpdateVar(const vname : string);
  145.    var tmp : string;
  146.    begin
  147.      tmp := Table1.FieldByName(vname).AsString;
  148.      Expression.StringValues[vname] := tmp;
  149.    end;
  150.  
  151.  
  152.   { Notice that we may end up having to update all 117 variables, even }
  153.   { though we will at most use only a few of them. As you can imagine, }
  154.   { this can be slow }
  155.  
  156. begin
  157.   UpdateVar('SYMBOL');
  158.   UpdateVar('CO_NAME');
  159.   UpdateVar('CO_NAME');
  160.   UpdateVar('CUR_PRICE');
  161.   UpdateVar('YRL_HIGH');
  162.   UpdateVar('YRL_LOW');
  163.   UpdateVar('P_E_RATIO');
  164.   UpdateVar('BETA');
  165.   UpdateVar('PROJ_GRTH');
  166.   UpdateVar('INDUSTRY');
  167.   UpdateVar('PRICE_CHG');
  168.   UpdateVar('SAFETY');
  169.   UpdateVar('RATING');
  170.   UpdateVar('RANK');
  171.   UpdateVar('OUTLOOK');
  172.   UpdateVar('RCMNDATION');
  173.   UpdateVar('RISK');
  174.  
  175.   { Check to see if we can avoid having to update sheet variables }
  176.   if UpdateSheetVars then
  177.   for r := 1 to MAXROWS do
  178.   for c := 1 to MAXCOLS do
  179.   begin
  180.     tmp := 'R'+IntToStr(R)+'C'+IntToStr(c);
  181.     Expression.StringValues[tmp] := FloatToStr(Sheet.SheetData[r,c]);
  182.   end;
  183. end;
  184.  
  185.  
  186.  
  187. procedure TForm2.SSheetGridGetEditText(Sender: TObject; ACol,
  188.   ARow: Longint; var Value: OpenString);
  189. begin
  190.    Value := FloatToStrF(Sheet.SheetData[ARow,Acol],ffCurrency,10,2);
  191. end;
  192.  
  193. procedure TForm2.SSheetGridSetEditText(Sender: TObject; ACol,
  194.   ARow: Longint; const Value: String);
  195. var temp : double;
  196. begin
  197.   Try
  198.     Sheet.SheetData[ARow,ACol] := StrToFloat(value);
  199.   except
  200.     {}
  201.   end;
  202. end;
  203.  
  204. procedure TForm2.FormDestroy(Sender: TObject);
  205. begin
  206.   Expression.Free;
  207. end;
  208.  
  209. procedure TForm2.SpeedButton1Click(Sender: TObject);
  210. var stringExpr : String;
  211. begin
  212.   StringExpr := FormulaEdit.Text;
  213.   if StringExpr <> '' then
  214.   begin
  215.     Expression.Formula := StringExpr;
  216.     if Expression.Status <> EXPR_SUCCESS then
  217.     begin
  218.       MessageBeep( MB_ICONHAND );
  219.       ResultPanel.Caption := Expression.StatusText;
  220.     end
  221.      else
  222.        ResultPanel.Caption := Expression.AsString;
  223.   end;
  224. end;
  225.  
  226. procedure TForm2.DataSource1DataChange(Sender: TObject; Field: TField);
  227. begin
  228.   UpdateVariables( False );
  229. end;
  230.  
  231. end.
  232.